home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library / Microsoft Programmer's Library (CD-ROM Database)(125-099-008)(Version 1.1a)(CDRM 162100)(1989).iso / AUDIO / CMACROS.INC next >
Text File  |  1986-10-22  |  14KB  |  1,094 lines

  1. comment $
  2. cmacros - assembly macros for interfacing to HHLs
  3. (C)Copyright Microsoft Corp. 1984, 1985, 1986
  4. $
  5. if1
  6. ASMpass=1
  7. outif MACRO name,defval,onmsg,offmsg
  8. ifndef name
  9. ifb <defval>
  10. name=0
  11. else
  12. name=defval
  13. endif
  14. endif
  15. if name
  16. name=1
  17. ifnb <onmsg>
  18. %out ! onmsg
  19. endif
  20. else
  21. ifnb <offmsg>
  22. %out ! offmsg
  23. endif
  24. endif
  25. endm
  26. ??error macro msg
  27. E r r o r ----- msg
  28. endm
  29. ifdef ?SMALL
  30. memS=1
  31. endif
  32. ifdef ?MEDIUM
  33. memM=1
  34. endif
  35. ifdef ?COMPACT
  36. memC=1
  37. endif
  38. ifdef ?LARGE
  39. memL=1
  40. endif
  41. ifdef ?HUGE
  42. memH=1
  43. endif
  44. %out cMacros Version 2.07 - 9/19/86
  45. %out Copyright (C) Microsoft Corp. 1984, 1985, 1986. All rights reserved.
  46. outif memS,0,<Small Model>
  47. outif memM,0,<Medium Model>
  48. outif memL,0,<Large Model>
  49. outif memC,0,<Compact Model>
  50. outif memH,0,<Huge Model>
  51. memMOD= memS + memM + memL + memC + memH
  52. if memMOD ne 1
  53. if memMOD eq 0
  54. memS= 1
  55. outif memS,0,<Small Model>
  56. else
  57. ??error <Must have only 1 memory model selected>
  58. endif
  59. endif
  60. sizeC= memM + memL + memH
  61. sizeD= memL + memC + (memH*2)
  62. outif ?DF,0,<No segments or groups will be defined>
  63. outif ?TF,0,<Epilog sequences assume valid SP>
  64. outif ?WIN,1,<Windows Support>
  65. outif ?PLM,1,<PLM calling convention>
  66. ifndef ?NODATA
  67. ?NODATA1=0
  68. else
  69. ?NODATA1=1
  70. %out ! NODATA module
  71. endif
  72. ifndef ?CHKSTK
  73. ?CHKSTK1=0
  74. else
  75. ?CHKSTK1=1
  76. ifdef ?CHKSTKPROC
  77. %out ! Private stack checking enabled
  78. else
  79. %out ! Stack checking enabled
  80. endif
  81. endif
  82. ifndef DOS5
  83. ?DOS5=0
  84. else
  85. ?DOS5=1
  86. %out ! DOS5 module
  87. endif
  88. ifdef ?PROFILE
  89. %out ! Native Profiling Enabled
  90. endif
  91. else
  92. ASMpass=2
  93. endif
  94. .XCREF
  95. .XCREF ?N,?AX,?AH,?AL,?BX,?BH
  96. .XCREF ?BL,?CX,?CH,?CL,?DX,?DH
  97. .XCREF ?DL,?SI,?DI,?ES,?DS,?BP
  98. .XCREF ?SP,?SS,?CS
  99. .XCREF ?RSL,?CPD,?argl,?argc,?BA
  100. .XCREF ?ACB,???,?PO
  101. .XCREF ?PAS,?PC
  102. .XCREF Uconcat,mPush,mPop
  103. .XCREF ?RI,?pp,?pp1,?al1
  104. .XCREF ?aD,?AP,?Atal,?dd,?dd1
  105. .XCREF ?pg,?pg1,?aloc,?cs1,?cs2
  106. .XCREF ?DF,?TF,?FF,?PLM,?WIN,?IA,?PU,?ADJ
  107. .XCREF ?UF,?RP,?NX,?ND,?NODATA1,?CHKSTK1,?DOS5
  108. .XCREF ?WFP
  109. ?RSL = 0
  110. ?CPD = 0
  111. ?ArgL = 0
  112. ?ArgC = 0
  113. ?BA = 0
  114. ?ACB = 0
  115. ??? = 0
  116. ?PO = 0
  117. ?PAS = 0
  118. ?PC = 0
  119. ?IA = 0
  120. ?PU = 0
  121. ?ADJ = 0
  122. ?RP = 0
  123. ?UF = 0
  124. ?ND = 0
  125. ?NX = 0
  126. ?WFP = 0
  127. ?FF = 0
  128. ?N = 0000000000000000B
  129. ?AX = 0000000000000011B
  130. ?AH = 0000000000000001B
  131. ?AL = 0000000000000010B
  132. ?BX = 0000000000001100B
  133. ?BH = 0000000000000100B
  134. ?BL = 0000000000001000B
  135. ?CX = 0000000000110000B
  136. ?CH = 0000000000010000B
  137. ?CL = 0000000000100000B
  138. ?DX = 0000000011000000B
  139. ?DH = 0000000001000000B
  140. ?DL = 0000000010000000B
  141. ?SI = 0000000100000000B
  142. ?DI = 0000001000000000B
  143. ?ES = 0000010000000000B
  144. ?DS = 0000100000000000B
  145. ?BP = 0001000000000000B
  146. ?SP = 0010000000000000B
  147. ?SS = 0100000000000000B
  148. ?CS = 1000000000000000B
  149. .CREF
  150. uconcat macro a,b,c,d,e,f
  151. a&b c&d e&f
  152. endm
  153. mpush macro r
  154. irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
  155. if r AND ?&&x
  156. push x
  157. endif
  158. endm
  159. endm
  160. mpop macro r
  161. irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
  162. if r AND ?&&x
  163. pop x
  164. endif
  165. endm
  166. endm
  167. save macro r
  168. ?RSL=0
  169. ?RI ?RSL,<r>
  170. endm
  171. ?RI macro n,r
  172. irp x,<r>
  173. ifdef ?&&x
  174. n=n OR ?&&x
  175. endif
  176. endm
  177. endm
  178. parmB macro n
  179. ?pp <n>,<byte>,2,1
  180. endm
  181. parmW macro n
  182. ?pp <n>,<word>,2,2
  183. endm
  184. parmD macro n
  185. ife ?PLM
  186. irp x,<n>
  187. ?pp <&&x>,<DWORD>,0,4
  188. ?pp <Off_&&x>,<WORD>,2,2
  189. ?pp <Seg_&&x>,<WORD>,2,2
  190. endm
  191. else
  192. irp x,<n>
  193. ?pp <Seg_&&x>,<WORD>,2,2
  194. ?pp <Off_&&x>,<WORD>,2,2
  195. ?pp <&&x>,<DWORD>,0,4
  196. endm
  197. endif
  198. endm
  199. parmQ macro n
  200. ?pp <n>,<QWORD>,8,8
  201. endm
  202. parmT macro n
  203. ?pp <n>,<TBYTE>,10,10
  204. endm
  205. if sizeC
  206. parmCP macro n
  207. parmD <n>
  208. endm
  209. else
  210. parmCP macro n
  211. parmW <n>
  212. endm
  213. endif
  214. if sizeD
  215. parmDP macro n
  216. parmD <n>
  217. endm
  218. else
  219. parmDP macro n
  220. parmW <n>
  221. endm
  222. endif
  223. ?pp macro n,t,l,s
  224. if ?CPD
  225. .xcref
  226. irp x,<n>
  227. .xcref ?T&&x
  228. ?T&&x=s
  229. ife ?PLM
  230. ?pp1 x,<t>,,,%(?PO+?adj)
  231. ?PO=?PO+l
  232. else
  233. ?PO=?PO+l
  234. ?pp1 x,<t>,%?PO,%?adj
  235. endif
  236. endm
  237. .cref
  238. else
  239. ??error <Parm(s) "&n" declared outside proc def>
  240. endif
  241. endm
  242. ?pp1 macro n,t,o,a,b
  243. ife ?PLM
  244. n equ t ptr [bp+b]
  245. else
  246. n equ t ptr [bp+a+?PO-o]
  247. endif
  248. endm
  249. ifndef ?NOPARMR
  250. .XCREF
  251. .XCREF ?pr
  252. .CREF
  253. parmR macro n,r,r2
  254. ?pr n,r,r2,%?RP,%(?IA+2)
  255. endm
  256. ?pr macro n,r,r2,i,o
  257. .xcref
  258. ifnb <r2>
  259. parmR SEG_&n,r
  260. parmR OFF_&n,r2
  261. n equ dword ptr [bp-o-2]
  262. .xcref ?T&n
  263. ?T&n=4
  264. else
  265. .xcref ?RP&i
  266. ?RP&i=0
  267. ifdef ?&r
  268. ?RP&i=?&r
  269. endif
  270. if ??? OR (?CPD EQ 0) OR (?RP&i EQ 0)
  271. ??error <invalid parmR encountered: &n,&r>
  272. exitm
  273. endif
  274. n equ word ptr [bp-o]
  275. ?T&n=2
  276. irp x,<bh,ch,dh,bl,cl,dl,ah,al>
  277. if ?&&x EQ ?&r
  278. n equ byte ptr [bp-o]
  279. ?T&n=1
  280. exitm
  281. endif
  282. endm
  283. ?IA=?IA+2
  284. ?RP=?RP+1
  285. endif
  286. .cref
  287. endm
  288. endif
  289. localB macro n
  290. ?aLoc <n>,<BYTE ptr>,1,1,0
  291. endm
  292. localW macro n
  293. ?aLoc <n>,<WORD PTR>,2,2,1
  294. endm
  295. localD macro n
  296. irp x,<n>
  297. ?aLoc <Seg_&&x>,<WORD PTR>,2,2,1
  298. ?aLoc <Off_&&x>,<WORD PTR>,2,2,1
  299. ?aLoc <&&x>,<DWORD PTR>,0,4,1
  300. endm
  301. endm
  302. localQ macro n
  303. ?aLoc <n>,<QWORD PTR>,8,8,1
  304. endm
  305. localT macro n
  306. ?aLoc <n>,<TBYTE PTR>,10,10,1
  307. endm
  308. if sizeC
  309. localCP macro n
  310. localD <n>
  311. endm
  312. else
  313. localCP macro n
  314. localW <n>
  315. endm
  316. endif
  317. if sizeD
  318. localDP macro n
  319. localD <n>
  320. endm
  321. else
  322. localDP macro n
  323. localW <n>
  324. endm
  325. endif
  326. localV macro n,a
  327. ?aLoc <n>,,%(a),0,1
  328. endm
  329. ?aLoc macro n,t,l,s,a
  330. if ?CPD
  331. .xcref
  332. irp x,<n>
  333. ???=???+l
  334. if a
  335. ???=((??? + 1) AND 0FFFEH)
  336. endif
  337. ?aL1 x,<t>,%(???+?IA)
  338. .xcref ?T&&x
  339. ?T&&x=s
  340. endm
  341. .cref
  342. else
  343. ??error <Locals "&n" declared outside procedure def>
  344. endif
  345. endm
  346. ?aL1 macro n,t,o
  347. n equ t [bp-o]
  348. endm
  349. ifndef ?NOGLOBAL
  350. globalB macro n,i,s
  351. ?aD <n>,1
  352. ?dd n,1,<BYTE>,<DB>,<i>,<s>
  353. endm
  354. globalW macro n,i,s
  355. ?aD <n>,2
  356. ?dd n,1,<WORD>,<DW>,<i>,<s>
  357. endm
  358. globalD macro n,i,s
  359. ?aD <n>,4
  360. ?dd n,1,<DWORD>,<DD>,<i>,<s>
  361. endm
  362. globalQ macro n,i,s
  363. ?aD <n>,8
  364. ?dd n,1,<QWORD>,<DQ>,<i>,<s>
  365. endm
  366. globalT macro n,i,s
  367. ?aD <n>,10
  368. ?dd n,1,<TBYTE>,<DT>,<i>,<s>
  369. endm
  370. if sizeC
  371. globalCP macro n,i,s
  372. globalD n,<i>,<s>
  373. endm
  374. else
  375. globalCP macro n,i,s
  376. globalW n,<i>,<s>
  377. endm
  378. endif
  379. if sizeD
  380. globalDP macro n,i,s
  381. globalD n,<i>,<s>
  382. endm
  383. else
  384. globalDP macro n,i,s
  385. globalW n,<i>,<s>
  386. endm
  387. endif
  388. endif
  389. ifndef ?NOSTATIC
  390. staticB macro n,i,s
  391. ?aD <n>,1
  392. ?dd n,0,<BYTE>,<DB>,<i>,<s>
  393. endm
  394. staticW macro n,i,s
  395. ?aD <n>,2
  396. ?dd n,0,<WORD>,<DW>,<i>,<s>
  397. endm
  398. staticD macro n,i,s
  399. ?aD <n>,4
  400. ?dd n,0,<DWORD>,<DD>,<i>,<s>
  401. endm
  402. staticQ macro n,i,s
  403. ?aD <n>,8
  404. ?dd n,0,<QWORD>,<DQ>,<i>,<s>
  405. endm
  406. staticT macro n,i,s
  407. ?aD <n>,10
  408. ?dd n,0,<TBYTE>,<DT>,<i>,<s>
  409. endm
  410. if sizeC
  411. staticCP macro n,i,s
  412. staticD n,<i>,<s>
  413. endm
  414. else
  415. staticCP macro n,i,s
  416. staticW n,<i>,<s>
  417. endm
  418. endif
  419. if sizeD
  420. staticDP macro n,i,s
  421. staticD n,<i>,<s>
  422. endm
  423. else
  424. staticDP macro n,i,s
  425. staticW n,<i>,<s>
  426. endm
  427. endif
  428. endif
  429. ?dd macro n,p,t,d,i,s
  430. ife ?PLM
  431. n label t
  432. ?dd1 _&n,p,<d>,<i>,<s>
  433. else
  434. ?dd1 n,p,<d>,<i>,<s>
  435. endif
  436. endm
  437. ?dd1 macro n,p,d,i,s
  438. if p
  439. PUBLIC n
  440. endif
  441. ifb <s>
  442. n d i
  443. else
  444. ifb <i>
  445. n d s DUP (?)
  446. else
  447. n d s DUP (i)
  448. endif
  449. endif
  450. endm
  451. ifndef ?NOEXTERN
  452. .XCREF
  453. .XCREF ?ex1
  454. .CREF
  455. externB macro n
  456. ?ex1 <n>,1,<BYTE>
  457. endm
  458. externW macro n
  459. ?ex1 <n>,2,<WORD>
  460. endm
  461. externD macro n
  462. ?ex1 <n>,4,<DWORD>
  463. endm
  464. externQ macro n
  465. ?ex1 <n>,8,<QWORD>
  466. endm
  467. externT macro n
  468. ?ex1 <n>,10,<TBYTE>
  469. endm
  470. externNP macro n
  471. ?ex1 <n>,2,<NEAR>
  472. endm
  473. externFP macro n
  474. ?ex1 <n>,4,<FAR>
  475. endm
  476. if sizeC
  477. externP macro n
  478. ?ex1 <n>,4,<FAR>
  479. endm
  480. else
  481. externP macro n
  482. ?ex1 <n>,2,<NEAR>
  483. endm
  484. endif
  485. if sizeC
  486. externCP macro n
  487. ?ex1 <n>,4,<DWORD>
  488. endm
  489. else
  490. externCP macro n
  491. ?ex1 <n>,2,<WORD>
  492. endm
  493. endif
  494. if sizeD
  495. externDP macro n
  496. ?ex1 <n>,4,<DWORD>
  497. endm
  498. else
  499. externDP macro n
  500. ?ex1 <n>,2,<WORD>
  501. endm
  502. endif
  503. ?ex1 macro n,s,d
  504. irp x,<n>
  505. .xcref
  506. .xcref ?T&&x
  507. .cref
  508. ?T&&x=s
  509. ife ?PLM
  510. extrn _&&x:&d
  511. x equ _&&x
  512. else
  513. extrn x:&d
  514. endif
  515. endm
  516. endm
  517. endif
  518. ifndef ?NOLABEL
  519. .XCREF
  520. ?lblpu = 0
  521. .XCREF ?lb1,?lblpu
  522. .CREF
  523. labelB macro n
  524. ?lb1 <n>,1,<BYTE>
  525. endm
  526. labelW macro n
  527. ?lb1 <n>,2,<WORD>
  528. endm
  529. labelD macro n
  530. ?lb1 <n>,4,<DWORD>
  531. endm
  532. labelQ macro n
  533. ?lb1 <n>,8,<QWORD>
  534. endm
  535. labelT macro n
  536. ?lb1 <n>,10,<TBYTE>
  537. endm
  538. labelNP macro n
  539. ?lb1 <n>,2,<NEAR>
  540. endm
  541. labelFP macro n
  542. ?lb1 <n>,4,<FAR>
  543. endm
  544. if sizeC
  545. labelP macro n
  546. ?lb1 <n>,4,<FAR>
  547. endm
  548. else
  549. labelP macro n
  550. ?lb1 <n>,2,<NEAR>
  551. endm
  552. endif
  553. if sizeC
  554. labelCP macro n
  555. ?lb1 <n>,4,<DWORD>
  556. endm
  557. else
  558. labelCP macro n
  559. ?lb1 <n>,2,<WORD>
  560. endm
  561. endif
  562. if sizeD
  563. labelDP macro n
  564. ?lb1 <n>,4,<DWORD>
  565. endm
  566. else
  567. labelDP macro n
  568. ?lb1 <n>,2,<WORD>
  569. endm
  570. endif
  571. ?lb1 macro n,s,d
  572. ?lblpu=0
  573. irp x,<n>
  574. ifidn <x>,<PUBLIC>
  575. ?lblpu=1
  576. else
  577. .xcref
  578. .xcref ?T&&x
  579. .cref
  580. ?T&&x=s
  581. ife ?PLM
  582. if ?lblpu
  583. public _&&x
  584. endif
  585. _&&x label &d
  586. x equ _&&x
  587. else
  588. if ?lblpu
  589. public x
  590. endif
  591. x label &d
  592. endif
  593. endif
  594. endm
  595. endm
  596. endif
  597. ifndef ?NODEF
  598. defB macro n
  599. ?aD <n>,1
  600. endm
  601. defW macro n
  602. ?aD <n>,2
  603. endm
  604. defD macro n
  605. ?aD <n>,4
  606. endm
  607. defQ macro n
  608. ?aD <n>,8
  609. endm
  610. defT macro n
  611. ?aD <n>,10
  612. endm
  613. if sizeC
  614. defCP macro n
  615. defD <n>
  616. endm
  617. else
  618. defCP macro n
  619. defW <n>
  620. endm
  621. endif
  622. if sizeD
  623. defDP macro n
  624. defD <n>
  625. endm
  626. else
  627. defDP macro n
  628. defW <n>
  629. endm
  630. endif
  631. endif
  632. ?aD macro n,s
  633. irp x,<n>
  634. .xcref
  635. .xcref ?T&&x
  636. .cref
  637. ?T&&x=s
  638. endm
  639. endm
  640. ifndef ?NOPTR
  641. regPtr macro n,S,O
  642. farPtr n,S,O
  643. endm
  644. farptr macro n,S,O
  645. .xcref
  646. .xcref ?T&n
  647. .cref
  648. n ¯o
  649. push S
  650. push O
  651. &endm
  652. ?T&n=80h
  653. endm
  654. endif
  655. arg macro a
  656. irp x,<a>
  657. ?argc=?argc+1
  658. ?Atal <x>,%?argc
  659. endm
  660. endm
  661. ?Atal macro n,i
  662. .xcref
  663. .xcref ?ALI&i
  664. .cref
  665. ?ALI&i ¯o
  666. ?AP n
  667. &endm
  668. endm
  669. ?AP macro n
  670. ?argl=?argl+2
  671. ifdef ?T&n
  672. ife ?T&n-1
  673. push word ptr (n)
  674. exitm
  675. endif
  676. ife ?T&n-2
  677. push n
  678. exitm
  679. endif
  680. ife ?T&n-4
  681. push word ptr (n)+2
  682. push word ptr (n)
  683. ?argl=?argl+2
  684. exitm
  685. endif
  686. ife ?T&n-8
  687. push word ptr (n)+6
  688. push word ptr (n)+4
  689. push word ptr (n)+2
  690. push word ptr (n)
  691. ?argl=?argl+6
  692. exitm
  693. endif
  694. if ?T&n AND 80h
  695. n
  696. ?argl=?argl+2
  697. exitm
  698. endif
  699. ife ?T&n
  700. push word ptr (n)
  701. exitm
  702. endif
  703. endif
  704. push n
  705. endm
  706. ccall macro n,a,sleaze
  707. ifnb <a>
  708. Arg <a>
  709. endif
  710. mpush %?RSL
  711. ?argl=0
  712. ife ?PLM
  713. ?ACB=?argc
  714. else
  715. ?ACB=1
  716. endif
  717. rept ?argc
  718. uconcat <?ALI>,%?ACB
  719. uconcat <purge>,,<?ALI>,%?ACB
  720. ife ?PLM
  721. ?ACB=?ACB-1
  722. else
  723. ?ACB=?ACB+1
  724. endif
  725. endm
  726. ife ?PLM
  727. ifb <sleaze>
  728. call _&n
  729. else
  730. call n
  731. endif
  732. if ?argl
  733. add sp,?argl
  734. endif
  735. else
  736. call n
  737. endif
  738. mpop %?RSL
  739. ?RSL=0
  740. ?argc= 0
  741. ?argl= 0
  742. endm
  743. cProc macro n,c,a
  744. if ?CPD
  745. ?UTPE
  746. endif
  747. ?CPD=1
  748. ???=0
  749. ?argc=0
  750. ?BA=0
  751. ?PO=0
  752. ?PU=0
  753. ?IA=0
  754. ?adj=4
  755. ?RP=0
  756. ?UF=0
  757. ?WFP=0
  758. ?FF=0
  759. ?PAS=0
  760. ifnb <a>
  761. ?RI ?PAS,<a>
  762. endif
  763. ?PC=sizeC
  764. ?ND=?NODATA1
  765. ?NX=0
  766. irp x,<c>
  767. ifidn <x>,<FAR>
  768. ?PC=1
  769. endif
  770. ifidn <x>,<NEAR>
  771. ?PC=0
  772. endif
  773. ifidn <x>,<PUBLIC>
  774. ?PU=1
  775. endif
  776. ifidn <x>,<SMALL>
  777. ?UF=1
  778. endif
  779. ifidn <x>,<DATA>
  780. ?ND=0
  781. endif
  782. ifidn <x>,<NODATA>
  783. ?ND=1
  784. endif
  785. ifidn <x>,<ATOMIC>
  786. ?NX=1
  787. endif
  788. ifidn <x>,<FORCEFRAME>
  789. ?FF=1
  790. endif
  791. endm
  792. if (?NX eq 1) AND (?ND eq 0)
  793. ?NX = 0
  794. ??error <ATOMIC specified without NODATA - ATOMIC ignored>
  795. endif
  796. if ?PC
  797. if ?WIN
  798. ?WFP=1
  799. ife ?NX
  800. ?IA=2
  801. ?PAS = ?PAS AND (NOT ?ds)
  802. endif
  803. endif
  804. ?adj=?adj+2
  805. endif
  806. ?PAS = ?PAS AND (NOT (?sp+?cs+?ss))
  807. if ?UF
  808. ?PAS = ?PAS AND (NOT (?bp+?si+?di))
  809. endif
  810. ife ?PLM
  811. ?pg <_&n>,%?PU,%?PC,%?PAS,%?WFP,<n>
  812. else
  813. ?pg <n>,%?PU,%?PC,%?PAS,%?WFP,<n>
  814. endif
  815. endm
  816. ?pg macro n,p,c,a,w,nu
  817. .xcref
  818. if ?UF
  819. if ?RP
  820. ??error <parmR encountered in &n - user frame ignored>
  821. ?UF=0
  822. endif
  823. if ?ND
  824. ??error <NODATA encountered in &n - user frame ignored>
  825. ?UF=0
  826. endif
  827. endif
  828. cBegin ¯o g
  829. .xcref
  830. ?pg1 <n>,c,a,%?PO,w,%?UF,%?ND,%?RP
  831. ?CPD=0
  832. ?argc=0
  833. ?BA=1
  834. ???=(???+1) AND 0FFFEH
  835. if p
  836. PUBLIC n
  837. endif
  838. ife ?PLM
  839. ife c
  840. nu label near
  841. else
  842. nu label far
  843. endif
  844. endif
  845. ife c
  846. n proc NEAR
  847. else
  848. n proc FAR
  849. endif
  850. ifidn <g>,<nogen>
  851. if ???+?PO+a+?RP
  852. %out <cBegin - possible invalid use of nogen>
  853. endif
  854. else
  855. if ?UF
  856. ?MF c,%???,%?PO
  857. mPush a
  858. else
  859. if w
  860. ife ?ND
  861. mov ax,ds
  862. nop
  863. endif
  864. ife ?NX
  865. ife ?DOS5
  866. inc bp
  867. endif
  868. push bp
  869. mov bp,sp
  870. push ds
  871. else
  872. if ?FF+???+?PO+?RP
  873. push bp
  874. mov bp,sp
  875. endif
  876. endif
  877. ife ?ND
  878. mov ds,ax
  879. endif
  880. else
  881. if ?FF+???+?PO+?RP
  882. push bp
  883. mov bp,sp
  884. endif
  885. endif
  886. if ?RP
  887. ?UF=0
  888. rept ?RP
  889. uconcat mpush,,?RP,%?UF
  890. ?UF=?UF+1
  891. endm
  892. endif
  893. if ???
  894. if ?CHKSTK1
  895. ifdef ?CHKSTKPROC
  896. ?CHKSTKPROC %???
  897. else
  898. mov ax,???
  899. ife ?PLM
  900. call _chkstk
  901. else
  902. call chkstk
  903. endif
  904. endif
  905. else
  906. sub sp,???
  907. endif
  908. endif
  909. mPush a
  910. endif
  911. ifdef ?PROFILE
  912. if c
  913. call StartNMeas
  914. endif
  915. endif
  916. endif
  917. .cref
  918. purge cBegin
  919. &endm
  920. ?UTPE ¯o
  921. ??error <Unterminated Procedure Definition: "&n">
  922. &endm
  923. endm
  924. ?pg1 macro n,c,a,o,w,f,d,r
  925. .xcref
  926. cEnd ¯o g
  927. .xcref
  928. ?BA=0
  929. ifidn <g>,<nogen>
  930. if o+a+r
  931. %out <cEnd - possible invalid use of nogen>
  932. endif
  933. else
  934. ifdef ?PROFILE
  935. if c
  936. call StopNMeas
  937. endif
  938. endif
  939. mPop a
  940. if f
  941. db 0C3h
  942. else
  943. if w
  944. ife ?NX
  945. if (?TF eq 0) OR (???+?RP)
  946. lea sp,-2[bp]
  947. endif
  948. pop ds
  949. pop bp
  950. ife ?DOS5
  951. dec bp
  952. endif
  953. else
  954. if (?TF eq 0) OR (???+?RP)
  955. mov sp,bp
  956. endif
  957. if ???+?PO+?RP
  958. pop bp
  959. endif
  960. endif
  961. else
  962. if ?FF+???+?PO+?RP
  963. if (?TF eq 0) OR (???+?RP)
  964. mov sp,bp
  965. endif
  966. pop bp
  967. endif
  968. endif
  969. ife ?PLM
  970. ret
  971. else
  972. ret o
  973. endif
  974. endif
  975. endif
  976. n endp
  977. .cref
  978. purge cEnd
  979. &endm
  980. .cref
  981. endm
  982. assumes macro s,ln
  983. ifndef ln&_assumes
  984. assume s:ln
  985. else
  986. ln&_assumes s
  987. endif
  988. endm
  989. createSeg macro n,ln,a,co,cl,grp
  990. ifnb <grp>
  991. addSeg grp,n
  992. else
  993. ln&OFFSET equ OFFSET n:
  994. ln&BASE equ n
  995. ?cs3 <ln>,<n>
  996. endif
  997. ifnb <cl>
  998. n segment a co '&cl'
  999. else
  1000. n segment a co
  1001. endif
  1002. n ends
  1003. ?cs1 <ln>,<n>
  1004. endm
  1005. addSeg macro grp,seg
  1006. ifndef grp&_def
  1007. grp&_def=0
  1008. endif
  1009. if grp&_def ne ASMpass
  1010. grp&_add ¯o s
  1011. grp&_in <seg>,s
  1012. &endm
  1013. grp&_in ¯o sl,s
  1014. ifb <s>
  1015. grp group sl
  1016. else
  1017. grp&_add ¯o ns
  1018. grp&_in <sl,s>,ns
  1019. &endm
  1020. endif
  1021. &endm
  1022. grp&_def=ASMpass
  1023. else
  1024. grp&_add seg
  1025. endif
  1026. endm
  1027. defGrp macro grp,ln
  1028. addSeg grp
  1029. ifnb <ln>
  1030. ?cs3 <ln>,<grp>
  1031. ln&OFFSET equ OFFSET grp:
  1032. ln&BASE equ grp
  1033. endif
  1034. endm
  1035. ?cs1 macro ln,n
  1036. ln&_sBegin ¯o
  1037. ?MF &¯o c,l,p
  1038. if c
  1039. extrn n&_FARFRAME:near
  1040. call n&_FARFRAME
  1041. else
  1042. extrn n&_NEARFRAME:near
  1043. call n&_NEARFRAME
  1044. endif
  1045. db l shr 1
  1046. db p shr 1
  1047. &&endm
  1048. ?cs2 <ln>,<n>
  1049. n segment
  1050. &endm
  1051. endm
  1052. ?cs2 macro ln,n
  1053. sEnd ¯o
  1054. n ends
  1055. purge ?MF
  1056. &endm
  1057. endm
  1058. ?cs3 macro ln,n
  1059. ln&_assumes ¯o s
  1060. assume s:&n
  1061. &endm
  1062. endm
  1063. sBegin macro ln
  1064. ln&_sBegin
  1065. endm
  1066. ife ?DF
  1067. createSeg _TEXT,code,word,public,CODE
  1068. ife ?NODATA1
  1069. createSeg _DATA,data,word,public,DATA,DGROUP
  1070. defGrp DGROUP,DATA
  1071. endif
  1072. if ?CHKSTK1
  1073. ifndef ?CHKSTKPROC
  1074. externP <chkstk>
  1075. endif
  1076. endif
  1077. endif
  1078. errnz macro x
  1079. if2
  1080. if x
  1081. errnz1 <x>,%(x)
  1082. endif
  1083. endif
  1084. endm
  1085. errnz1 macro x1,x2
  1086. = *ERRNZ* x1 = x2
  1087. endm
  1088. errn$ macro l,x
  1089. errnz <OFFSET $ - OFFSET l x>
  1090. ENDM
  1091. ifdef ?PROFILE
  1092. externFP <StartNMeas, StopNMeas>
  1093. endif
  1094.